// 抽象类
// 程序架构设计 、为了实现面向对象，为了类型可以追根溯源。 主要使用他们的结构化特性。
// 面向对象的三大特征 封装、继承、多态
// 抽象类编译之后就变成了class
// 抽象类中可以写具体实现的方法、也可以写抽象成员、抽象方法不能有实现
abstract class Foo {
  abstract name: string;
  abstract method(name: string): string; // 抽象方法不能有实现
  abstract get nameGetter(): string; // get 方法也可以是抽象方法
}

// 使用
// 1. 抽象类 可以 继承抽象类 普通类不可以继承抽象类
// 2. 普通类 可以 实现抽象类
class Baz implements Foo {
  name: string = "王斌";
  method(name: string): string {
    throw new Error("Method not implemented.");
  }
  get nameGetter(): string {
    throw new Error("Method not implemented.");
  }
}
// 3. 抽象类2 继承 抽象1 ，抽象类2中实现类抽象类1中的部分抽象属性，那么如果一个普通方法 extends 抽象类2 可以不必再实现抽象类1中的部分抽象属性。
abstract class Baz2 extends Foo {
  name: string = "王斌";
  method(name: string): string {
    return name;
  }
}

class BazInstance2 extends Baz2 {
  get nameGetter(): string {
    throw new Error("Method not implemented.");
  }
}

export {};
